<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>5.认识VueComponent</title>
		<!-- 引入开发版本的Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
			School组件的本质到底是什么？
						1.School组件的本质是一个构造函数，名为VueComponent。
						2.VueComponent这个构造函数，不是程序员定义的，是Vue.extend()生成的。
						3.Vue.extend()每次生成的都是一个全新的VueComponent构造函数！！！
						4.我们只需要写<School></School>或<School/> Vue就会帮我们执行： new VueComponent(options)。
						5.关于this：
							(1).组件配置中：
										data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。vc
							(2).new Vue(options)配置中：
										data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。vm

						6.VueComponent的实例对象，以后简称vc（也可称之为：组件实例对象）。
							Vue的实例对象，以后简称vm。
		-->
		<!-- 准备好一个容器-->
		<div id="root"></div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		/* 
				Welcome组件被使用的整个流程：
						1.Welcome是啥？答：组件，本质是构造函数。
						2.一个Welcome组件定义好之后，就有一个VueComponent函数“待命”了，传入的配置也存下来了。
						3.程序员写了<Welcome/>后，框架帮我们new VueComponent，并应用我们写的配置，生成了一个实例——vc。
						4.vc上有Welcome组件中所配置的data数据、methods方法、computed计算属性等等。
		*/
		//定义一个WelCome组件
		const Welcome = Vue.extend({
			template:'<h1>欢迎学习Vue</h1>',
			mounted(){
				console.log('**',this)
			}
		})
		
		//定义一个School组件
		const School = Vue.extend({
			template:`
				<div style="background-color:skyblue;padding:10px">
					<h2>学校名：{{name}}</h2>	
					<button @click="showName">点我提示学校名</button>
				</div>
			`,
			data() {
				return {
					name:'尚硅谷'
				}
			},
			methods:{
				showName(){
					console.log('@',this)
					alert(this.name)
				}
			}
		})

		// console.log('@',School) //输出School组件，本质是VueComponent构造函数
		// console.log('#',Welcome) //输出Welcome组件，本质是VueComponent构造函数
		// console.log(School === Welcome) //验证：Vue.extend每次返回的都是一个全新的VueComponent

		//创建vm
		new Vue({
			el:'#root',
			template:`
				<div style="background-color:gray;padding:10px">
					<Welcome></Welcome>		
					<School></School>
				</div>
			`,
			components:{School,Welcome}
		})
		
	</script>
</html>